from django.shortcuts import render

# Create your views here.
import json
import random

from django import http
from django.http import JsonResponse
from django.views import View
from django_redis import get_redis_connection



# 图片验证码
from apps.verifications.libs.captcha.captcha import captcha


class ImageCodeView(View):
    def get(self, request):
        uuid = request.GET.get('cur')  # 定义 uuid  接受前端cur的值
        # 生成图形验证码
        text, image = captcha.generate_captcha() # 定义 text 接受图片验证码  定义 image 接受图片

        # 把验证码保存到redis数据库
        redis_conn = get_redis_connection('verify_code')

        # redis_conn.setex('key', '过期时间', 'value')
        redis_conn.setex(f'image_{uuid}', 300, text)

        # 响应图形验证码: image/jpg
        return http.HttpResponse(image, content_type='image/jpeg')


# 短信验证码接口文档：
# 请求路径：api/v1.0/phonecode/
# 请求方式：POST
# 请求参数:mobile  image_code  image_code_id
# 响应内容:json


# 短信验证码
class PhoneCodeView(View):
    def post(self, request):
        # 1.接收参数 --- mobile -- image_code---image_code_id
        mobile = json.loads(request.body).get('mobile')  # 手机号
        image_code = json.loads(request.body).get('image_code')  # 图片验证码
        uuid = json.loads(request.body).get('image_code_id')  # uuid

        # 2.校验参数 -- image_code_id正则
        if not all([image_code, uuid]):  # 校验参数不全
            return JsonResponse({'errno': 400, 'errmsg': '参数不能为空!'})

        # 3.校验图片验证码--前端--后端是否一致
        client = get_redis_connection('verify_code')  # 链接redis 数据库
        client_img_code = client.get(f'image_{uuid}')  # 校验是否与数据库中的结果是否一致
        client.delete(f'img_{uuid}')  # 检验完后删除 uuid

        if not client_img_code:  # 如果数据库里无数据
            return JsonResponse({'errno': 400, 'errmsg': '图片验证码过期!'})

        # 千万注意点: redis取出来 bytes.decode() == str
        if client_img_code.decode().lower() != image_code.lower():  # 如果用户输入的数据与数据库中的数据不一致，返回响应结果
            return JsonResponse({'errno': 400, 'errmsg': '图片验证码输入有误!'})

        # 避免频繁发送短信
        send_flag = client.get(f'send_flag{mobile}')  # 链接数据库，查询是否存在手机号 标记

        # 如果标记存在--代表已经发送过了短信
        if send_flag:
            return JsonResponse({'errno': 400, 'errmsg': '短信发送频繁!'})

        # 4.生成随机 6位 的数字
        sms_code = random.randint(100000, 999999)  # 随机生成 验证码
        print(sms_code)
        # 5.保存redis-数据库 2号 (mobile)k:v
        client.setex(f'sms_{mobile}', 300, sms_code)  # 把手机号 ，过期时间， 短信验证码保存到redis数据库里

        # 6.调用容联云
        from ronglian_sms_sdk import SmsSDK
        accId = '8a216da879f058330179fdc19cc7040a'  # 主账号id
        accToken = '9b40aa8218234dea89deb692f8e6529e'  # 主账号TOKEN
        appId = '8a216da879f058330179fdc19db40410'  # 应用id

        # 实例化通讯对象
        sdk = SmsSDK(accId, accToken, appId)
        # 调用发短信的函数       短信模板id   手机号          短信验证码和过期时间  分钟
        resp = sdk.sendMessage(tid='1', mobile=mobile, datas=(sms_code, 5))

        print('短信验证码：', sms_code)

        # 发送完短信，开启标记
        client.setex(f'send_flag{mobile}', 60, 1)  # 开启标记 时间是60s  1是占位符， 不能为空
        # 7.返回响应对象
        return JsonResponse({'errno': 0, 'errmsg': '短信发送成功!'})
